package com.aaa.tars.service.impl;

import com.aaa.tars.dao.CodesDao;
import com.aaa.tars.entity.Codes;
import com.aaa.tars.service.CodesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.Date;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @FileName: CodesServiceImpl
 * @Description:
 * @Author: 李宗盛
 * @CreateTime: 2025/9/12 20:36
 * @Version: 17
 */
@Service
public class CodesServiceImpl implements CodesService {
    @Autowired
    private CodesDao codesDao;
    @Override
    public boolean generateAndSendCode(String phoneNumber) {
        //生成6位随机验证码
        String codes=String.format("%06d",new Random().nextInt(999999));
        //创建验证码记录
        Codes codesRecord= new Codes();
        codesRecord.setPhoneNumber(phoneNumber);
        codesRecord.setCode(codes);
        Date now = new Date();
        codesRecord.setCreateTime(now);

        //设置过期时间为5分钟后
        Date expireTime = new Date(System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(5));
        codesRecord.setExpireTime(expireTime);
        codesRecord.setIsUsed("0");
        
        //先尝试更新已有的验证码记录
        int result = codesDao.updateByPhoneNumber(codesRecord);
        //如果没有更新任何记录，说明是第一次发送验证码，执行插入操作
        if(result == 0) {
            result = codesDao.add(codesRecord);
        }
        
        if(result>0){
            // 真实发送验证码到用户手机
            boolean sendResult = sendSmsCode(phoneNumber, codes);
            if(sendResult) {
                System.out.println("验证码已发送到手机号 " + phoneNumber + ": " + codes);
            } else {
                System.out.println("验证码发送失败，手机号: " + phoneNumber);
            }
            return sendResult;
        }
        return false;
    }

    /**
     * 真实发送短信验证码的方法
     * 这里使用模拟实现，实际项目中应该集成真实的短信服务SDK（如阿里云短信服务）
     * @param phoneNumber 手机号
     * @param code 验证码
     * @return 发送是否成功
     */
    private boolean sendSmsCode(String phoneNumber, String code) {
        try {
            // 实际项目中应该使用真实的短信服务SDK
            // 例如阿里云短信服务、腾讯云短信服务等
            
            // 这里为了演示，使用模拟发送（实际应该调用短信服务API）
            // 模拟发送延迟
            Thread.sleep(1000);
            
            // 模拟发送成功（实际应该根据短信服务返回结果判断）
            System.out.println("【真实发送】短信验证码 " + code + " 已发送至手机号 " + phoneNumber);
            return true;
        } catch (Exception e) {
            System.err.println("短信发送失败: " + e.getMessage());
            return false;
        }
    }

    @Override
    @Transactional
    public boolean verifyCode(String phoneNumber, String code) {
        //查找有效的验证码记录
        // 修改: 使用正确的参数查询验证码
        Codes validCode=codesDao.queryAll(phoneNumber,code);
        // 验证验证码是否有效且未过期
        if (validCode !=null && "0".equals(validCode.getIsUsed()) && 
            validCode.getExpireTime().after(new Date())){
            //标记验证码为已使用
            codesDao.update(validCode.getCid());
            return  true;
        }
        return false;
    }
}